package com.njts.extend;

import java.util.UUID;

/**
 * @author David GE
 * Date  2025/11/19
 * 设计一个医务室的挂号系统,有三类用户使用它
 * admin patient doctor nurse -->User
 */
        // 语义化
    // 面试题:抽象类不能实例化对象,那么它有构造方法吗,作用是什么? 有,为子类实现提供实例化对象时的初始操作
public abstract class AbstractUser {
    public AbstractUser(){
        System.out.println("抽象用户被创建");
    }
    private int id;
    private String username;

    private String password;
    private int age;
    private String phone;
    private String gender;
    public String getPassword() {
        return password;
    }

    public void setPassword(String password) {
        this.password = password;
    }
    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    public String getUsername() {
        return username;
    }

    public void setUsername(String username) {
        this.username = username;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

    public String getPhone() {
        return phone;
    }

    public void setPhone(String phone) {
        this.phone = phone;
    }

    public String getGender() {
        return gender;
    }

    public void setGender(String gender) {
        this.gender = gender;
    }
    private void seeInfo(){
        System.out.println("这是用户的隐私,只能自己看");
    }

    public String getRole() {
        return role;
    }

    public void setRole(String role) {
        this.role = role;
    }

    // 受保护的  角色
    protected String role;
   // 不同用户的注册行为各不相同
    // admin账号预先设定,无需注册
    // 病人注册时需要提供门诊号 挂号之后才能在此系统中看到挂号记录
    // 医生注册时提供资格证
    public abstract void register(String username,String password);//抽象的行为,无法决定具体的操作
}
// 2 抽象类的作用:让子类继承(实现) 因为抽象类本身不能实例化对象,必须要有具体的子类完善(实现)其中的抽象行为(方法),前提:子类必须重写父类的抽象方法
// 抽象方法:被abstract 关键字修饰,没有方法体的方法
// 要求:抽象方法只能出现在抽象类中.
// 抽象类是否一定含有抽象方法?
// 抽象类和抽象方法的引入解决了通用设计,制定统一标准,规范的问题
// 自下而上抽取共通的属性和行为,为具体的行为如何实现确定规范->抽象
//抽象:难以理解?->代码简约设计的雏形,让编码更加灵活
class PatientUser extends AbstractUser{

    @Override
    public void register(String username, String password) {
        System.out.println(username+"挂号");
        System.out.println("门诊号"+ UUID.randomUUID().toString());
        this.setUsername(username);
        this.setPassword(password);
        System.out.println(username+"注册成功");
    }
}

class DoctorUser extends AbstractUser{
    @Override
    public void register(String username, String password) {
        System.out.println(username+"提交医师资格证");
        System.out.println("资格证编号"+ UUID.randomUUID().toString());
        this.setUsername(username);
        this.setPassword(password);
        System.out.println(username+"注册成功");
    }


}

class AdminUser extends AbstractUser {
    @Override
    public void register(String username, String password) {
        this.setUsername(username);
        this.setPassword(password);
        System.out.println(username + "注册成功");
    }
}